﻿package com.cw.war.ui
{
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.geom.Rectangle;

	public class MaskedSprite extends Sprite 
	{
		private var autoMask : Boolean = false;
		private var autoMaskShape : Shape;
		private var maskBound : Rectangle;

		/**
		 * 创建一个<code>MaskedSprite</code>对象。
		 * @param autoMask		使用自动使用遮罩，默认为<code>true</code>。
		 * @see	#setAutoMask()
		 */
		public function MaskedSprite (autoMask : Boolean = true)
		{
			this.focusRect = false;
			this.tabEnabled = false;
			this.maskBound = new Rectangle( );
			this.setAutoMask( autoMask );
		}

		/**
		 * 设置是否使用自动遮罩模式。
		 * 当设置为<code>true</code>时，对象会对自己进行遮罩，可以通过<code>setMaskBound()</code>方法，设置遮罩的大小。
		 * 当设置为<code>false</code>时，对象会显示自己全部的内容。
		 * @param autoMask		是否使用自动遮罩模式。
		 * @see	#setMaskBound()
		 * @see	#isAutoMask()
		 */
		public function setAutoMask (autoMask : Boolean) : void
		{
			if(this.autoMask != autoMask)
			{
				this.autoMask = autoMask;
				if(this.autoMask)
				{
					if(this.autoMaskShape == null)
					{
						this.autoMaskShape = new Shape( );
						this.autoMaskShape.graphics.beginFill( 0 , 0.5 );
						this.autoMaskShape.graphics.drawRect( 0 , 0 , 1 , 1 );
						this.autoMaskShape.graphics.endFill( );
					}
					//添加入显示列表，否则本地浏览会出错
					if(this.autoMaskShape.parent != this)
					{
						super.addChild( this.autoMaskShape );
					}
					//设置遮罩大小
					this.setMaskBound( this.maskBound );
					//设置遮罩
					this.mask = this.autoMaskShape;
				}
				else
				{
					if(this.autoMaskShape && this.autoMaskShape.parent == this)
					{
						this.removeChild( this.autoMaskShape );
					}
					this.mask = null;
				}
			}
		}

		/**
		 * 查询对象是否处于自动遮罩模式。
		 * @return		<code>true</code>，对象处于自动遮罩模式<code>false</code>，对象不处于自动遮罩模式。
		 * @see	#setAutoMask()
		 */
		public function isAutoMask () : Boolean
		{
			return this.autoMask;
		}

		/**
		 * 设置遮罩大小。
		 * 当对象在自动遮罩模式时，设置此属性，可以直接设置对象遮罩的大小同时也会缓存当前的设置。
		 * 当对象不处于自动遮罩模式时，设置此属性对象会缓存需要设置的大小；当再次切换到自动遮罩模式时，即使用先前设置的大小设置遮罩。
		 * 方法不会修改传递的<code>IntRectangle</code>对象
		 * <ul>
		 * <li>setMaskBound (bound : Rectangle)</li>
		 * <li>setMaskBound (x:int,y : int = 0,width : int = 0,height : int = 0)</li>
		 * </ul>
		 * @param bound		要设置的遮罩大小。
		 * @see	#setAutoMask()
		 */
		public function setMaskBound (bound : Object,y : int = 0,width : int = 0,height : int = 0) : void
		{
			var xx : int,yy : int,ww : int,hh : int;
			if(bound is Rectangle)
			{
				var b : Rectangle = bound as Rectangle;
				xx = b.x;
				yy = b.y;
				ww = b.width;
				hh = b.height;
			}
			else
			{
				xx = bound as int;
				yy = y;
				ww = width;
				hh = height;
			}
			if(this.autoMaskShape && this.autoMaskShape.parent == this)
			{
				this.autoMaskShape.x = xx;
				this.autoMaskShape.y = yy;
				this.autoMaskShape.width = ww;
				this.autoMaskShape.height = hh;
			}
			//复制属性
			this.maskBound.x = xx;
			this.maskBound.y = yy;
			this.maskBound.width = ww;
			this.maskBound.height = hh;
		}

		/**
		 * 返回影片剪辑的大小。
		 */
		public function getMaskBound () : Rectangle
		{
			return this.maskBound.clone( );
		}
	}
}
